package com.ovidiojf.fieldplan.atleta;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import com.ovidiojf.fieldplan.avaliacaoFisica.AvaliacaoFisica;
import com.ovidiojf.fieldplan.equipe.Equipe;
import com.ovidiojf.fieldplan.pessoa.Endereco;
import com.ovidiojf.fieldplan.pessoa.Pessoa;

@Entity
@Table(name="atletas")
public class Atleta extends Pessoa implements Serializable {
	
	private static final long serialVersionUID = 2143423677968659256L;

	
	private String matricula;
	@ManyToMany(cascade=CascadeType.ALL)
	@Fetch(FetchMode.SUBSELECT)
	@JoinTable (
			name="equipes_e_atletas",
			joinColumns= @JoinColumn(name="id_do_atleta"),
			inverseJoinColumns = @JoinColumn(name="id_da_equipe")
	)
	private List<Equipe> equipes = new ArrayList<Equipe>();

	
	@OneToMany(mappedBy="atleta", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
	private List<AvaliacaoFisica> avaliacoesFisicas;
	
//	private AvaliacaoFisica ultimaAvaliacaoFisica;
	
	public Atleta() {
	}
	
	public Atleta(String nome, String cpf, String matricula) {
		
		this.setNome(nome);
		this.setCpf(cpf);
		this.setDataCadastro(new Date());
		this.setMatricula(matricula);
		this.setEndereco(new Endereco());
//		this.setContato(new Contato());
		
	}
	
	public Integer qtdEquipes() {
		return equipes.size();
	}

	public String getMatricula() {
		return matricula;
	}

	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}

	public List<Equipe> getEquipes() {
		return equipes;
	}

	public void setEquipes(List<Equipe> equipes) {
		this.equipes = equipes;
	}
	
	
	public List<AvaliacaoFisica> getAvaliacaoFisica() {
		return avaliacoesFisicas;
	}

	public void setAvaliacaoFisica(List<AvaliacaoFisica> avaliacaoFisica) {
		this.avaliacoesFisicas = avaliacaoFisica;
	}

	public AvaliacaoFisica ultimaAvaliacaoFisica() {

		if(avaliacoesFisicas!= null && !avaliacoesFisicas.isEmpty())		
			return avaliacoesFisicas.get(0);
		
		return new AvaliacaoFisica();
	}
	
	public AvaliacaoFisica ultima() {
		if(avaliacoesFisicas!= null && avaliacoesFisicas.get(0) != null)		
			return avaliacoesFisicas.get(0);
		
		return new AvaliacaoFisica();
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = super.hashCode();
		result = prime * result + ((equipes == null) ? 0 : equipes.hashCode());
		result = prime * result
				+ ((matricula == null) ? 0 : matricula.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!super.equals(obj))
			return false;
		if (getClass() != obj.getClass())
			return false;
		Atleta other = (Atleta) obj;
		if (equipes == null) {
			if (other.equipes != null)
				return false;
		} else if (!equipes.equals(other.equipes))
			return false;
		if (matricula == null) {
			if (other.matricula != null)
				return false;
		} else if (!matricula.equals(other.matricula))
			return false;
		return true;
	}
	
	
	
	
	
}
